package d1_midterm_examination.d1_firstquestion;

import java.util.*;

/**
 * 这个答案是错误的: 不可以定义set集合-->set集合的特点是: 无序、不重复、无索引--->要的就是囚犯有索引
 */
public class FirstQuestion {
    public static void main(String[] args) {
        //目标: 完成击杀囚犯的题目
        //需求: 输出幸存者的编号,以及它第一次所占的位置
        //1、定义一个集合用于存储囚犯-->由于编号是不可以重复,是用HashSet<>进行曲重
        Set<Integer> prisoners1 = new HashSet<>();

        //5、再创建一个集合,进行记录囚犯,便于操作
        List<Integer> prisoners = new ArrayList<>();


        //2、创建一个随机数对象
        Random r = new Random();

        //3、随机生成100个编号,存到集合中去
        while (prisoners.size() < 100) {
            //4、生成随机编号,压到内存中
            prisoners.add(r.nextInt(200) + 1);
        }

        //6、将Set中的数据倒给List的集合
        prisoners1.addAll(prisoners);
        System.out.println(prisoners);
        //4、调用方法输出幸存者的编号,与他第一次位置的值
        getSurvivor(prisoners);
        //再创建一个集合,为1-100数据,传过去,进行输出即可
        List<Integer> numbers = new ArrayList<>();
        for (int i = 1; i < 101; i++) {
            numbers.add(i);
        }
        getSurvivor(numbers);
    }

    //实现获取幸存者编号的功能
    private static void getSurvivor(List<Integer> prisoners) {
        //

        //5、给出递归的退出条件
        if (prisoners.size() == 1){
            System.out.println(prisoners);
            return;
        }
        //1、遍历集合-->获取每一位囚犯
        for (int i = 0; i < prisoners.size(); i++) {
            //2、判断是否是奇数
            if ((i+1)%2 != 0){
                //3、是奇数,进行删除
                prisoners.remove(i);
            }
        }
        //4、第一轮删除之后,就开始递归,开始下一轮删除
        getSurvivor(prisoners);
//        return -1;
    }
}
